package br.com.furb.larcmsg.bean;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import br.com.furb.larcmsg.controller.Controller;
import br.com.furb.larcmsg.model.Mensagem;
import br.com.furb.larcmsg.model.Usuario;

@ManagedBean
@ViewScoped
public class ChatBean {
	
	private Controller controller;
	private List<Mensagem> mensagens = new LinkedList<Mensagem>();
	private Collection<Usuario> usuarios;
	private String texto;
	private Usuario usuarioSelecionado;
	
	@ManagedProperty(value="#{loginBean}")
	private LoginBean loginBean;
	
	@PostConstruct
	private void init() throws Exception{
		if(loginBean.getId() != null) {
			controller = new Controller(loginBean.getId(),loginBean.getSenha());
			keepAlive();
		}
	}
	
	public void enviarMensagem() throws Exception {
		if(usuarioSelecionado == null) {
			controller.enviarMensagemBroadcast(texto);
		} else {
			controller.enviarMensagem(texto,usuarioSelecionado);
		}
		texto = null;
	}
	
	public void keepAlive() throws Exception {
		if(controller == null) {
			FacesContext fc = FacesContext.getCurrentInstance();
			ExternalContext ec = fc.getExternalContext();
			ec.redirect(ec.getRequestContextPath() + "/faces/login.xhtml");
			return;
		}
		
		usuarios = controller.buscaUsuarios();
		
		if(usuarioSelecionado != null && !usuarios.contains(usuarioSelecionado)) {
			usuarioSelecionado = null;
		}
	}
	
	public void buscaMensagens() throws Exception {
		if(controller == null) {
			return;
		}
		
		mensagens.addAll(controller.buscaMensagens());
	}

	public void selecionarUsuario(Usuario usuario) {
		if(usuario.equals(usuarioSelecionado)) {
			usuarioSelecionado = null;
		} else {
			usuarioSelecionado = usuario;
		}
	}
	
	public List<Mensagem> getMensagens() {
		return mensagens;
	}
	

	public Collection<Usuario> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(Collection<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public void setMensagens(List<Mensagem> mensagens) {
		this.mensagens = mensagens;
	}

	public String getTexto() {
		return texto;
	}

	public void setTexto(String texto) {
		this.texto = texto;
	}

	public Usuario getUsuarioSelecionado() {
		return usuarioSelecionado;
	}

	public void setUsuarioSelecionado(Usuario usuarioSelecionado) {
		this.usuarioSelecionado = usuarioSelecionado;
	}

	public LoginBean getLoginBean() {
		return loginBean;
	}

	public void setLoginBean(LoginBean loginBean) {
		this.loginBean = loginBean;
	}
	
}
